home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d18 / lzhtv10.arc / INTRCOMM.INT < prev    next >
Text File  |  1989-04-21  |  5KB  |  151 lines

  1.  
  2. (*
  3.  * Copyright 1987, 1989 Samuel H. Smith;  All rights reserved
  4.  *
  5.  * This is a component of the ProDoor System.
  6.  * Do not distribute modified versions without my permission.
  7.  * Do not remove or alter this notice or any other copyright notice.
  8.  * If you use this in your own program you must distribute source code.
  9.  * Do not use any of this in a commercial product.
  10.  *
  11.  *)
  12.  
  13. const
  14.    carrier_lost = #$E3;              (* code returned with carrier is lost *)
  15.  
  16.    com_current_chan: integer = 0;    (* current communication channel *)
  17.  
  18.    port_base:    integer = -1;  (* base port number for 8250 chip *)
  19.                                 (* value = -1 until init is finished *)
  20.  
  21.    old_vector:   pointer = nil; (* pointer to original com interrupt handler *)
  22.    
  23.    XOFF_char:    char = ^S;     (* XOFF character code *)
  24.  
  25.    disable_cts_check: boolean = false; {false if RTS handshake is needed}
  26.    even_parity:   boolean = false; {strip parity?}
  27.  
  28.  
  29.  
  30. var
  31.    port_intr:    integer;       (* interrupt number for 8250 chip *)
  32.    intr_mask:    integer;       (* interrupt controller initialization code *)
  33.  
  34.    prev_LCR:     integer;       (* previous LCR contents *)
  35.    prev_IER:     integer;       (* previous IER contents *)
  36.    prev_MCR:     integer;       (* previous MCR contents *)
  37.    prev_ICTL:    integer;       (* previous ICTL contents *)
  38.  
  39.    xmit_active:  boolean;       (* is the transmitter active now?
  40.                                    (is a THRE interrupt expected?) *)
  41.  
  42.    XOFF_active:  boolean;       (* has XOFF suspended transmit? *)
  43.  
  44.    rxque:        queue_rec;     (* receive data queue *)
  45.    txque:        queue_rec;     (* transmit data queue *)
  46.  
  47.    reg:          registers;     (* register package *)
  48.  
  49.  
  50. (*
  51.  * Uart register definitions
  52.  *
  53.  *)
  54.  
  55. const
  56.    ICTL = $21;                  (* system interrupt controller i/o port *)
  57.  
  58.    RBR = 0;  (* receive buffer register *)
  59.    THR = 0;  (* transmit holding register *)
  60.  
  61.    DLM = 1;  (* divisor latch MSB *)
  62.    IER = 1;  (* interrupt enable register *)
  63.       IER_DAV     = $01;       (* data available interrupt *)
  64.       IER_THRE    = $02;       (* THR empty interrupt *)
  65.       IER_LSRC    = $04;       (* line status change interrupt *)
  66.       IER_MSR     = $08;       (* modem status interrupt *)
  67.  
  68.  
  69.    IIR = 2;  (* interrupt identification register *)
  70.       IIR_PENDING = $01;       (* low when interrupt pending *)
  71.  
  72.       IIR_MASK    = $06;       (* mask for interrupt identification *)
  73.         IIR_MSR     = $00;       (* modem status change interrupt *)
  74.         IIR_THRE    = $02;       (* transmit holding reg empty interrupt *)
  75.         IIR_DAV     = $04;       (* data available interrupt *)
  76.         IIR_LSR     = $06;       (* line status change interrupt *)
  77.  
  78.  
  79.    LCR = 3;  (* line control register *)
  80.       LCR_5BITS   = $00;       (* 5 data bits *)
  81.       LCR_7BITS   = $02;       (* 7 data bits *)
  82.       LCR_8BITS   = $03;       (* 8 data bits *)
  83.  
  84.       LCR_1STOP   = $00;       (* 1 stop bit *)
  85.       LCR_2STOP   = $04;       (* 2 stop bits *)
  86.  
  87.       LCR_NPARITY = $00;       (* no parity *)
  88.       LCR_EPARITY = $38;       (* even parity *)
  89.  
  90.       LCR_NOBREAK = $00;       (* break disabled *)
  91.       LCR_BREAK   = $40;       (* break enabled *)
  92.  
  93.       LCR_NORMAL  = $00;       (* normal *)
  94.       LCR_ABDL    = $80;       (* address baud divisor latch *)
  95.  
  96.  
  97.    MCR = 4;  (* modem control register *)
  98.       MCR_DTR     = $01;       (* active DTR *)
  99.       MCR_RTS     = $02;       (* active RTS *)
  100.       MCR_OUT1    = $04;       (* enable OUT1 *)
  101.       MCR_OUT2    = $08;       (* enable OUT2 -- COM INTERRUPT ENABLE *)
  102.       MCR_LOOP    = $10;       (* loopback mode *)
  103.  
  104.  
  105.    LSR = 5;  (* line status register *)
  106.      LSR_DAV      = $01;       (* data available *)
  107.      LSR_OERR     = $02;       (* overrun error *)
  108.      LSR_PERR     = $04;       (* parity error *)
  109.      LSR_FERR     = $08;       (* framing error *)
  110.      LSR_BREAK    = $10;       (* break received *)
  111.      LSR_THRE     = $20;       (* THR empty *)
  112.      LSR_TSRE     = $40;       (* transmit shift register empty *)
  113.  
  114.  
  115.    MSR = 6;  (* modem status register *)
  116.      MSR_DCTS     = $01;       (* delta CTS *)
  117.      MSR_DDSR     = $02;       (* delta DSR *)
  118.      MSR_DRING    = $04;       (* delta ring *)
  119.      MSR_DRLSD    = $08;       (* delta receive line signal detect *)
  120.      MSR_CTS      = $10;       (* clear to send *)
  121.      MSR_DSR      = $20;       (* data set ready *)
  122.      MSR_RING     = $40;       (* ring detect *)
  123.      MSR_RLSD     = $80;       (* receive line signal detect *)
  124.  
  125.  
  126. procedure disable_int;
  127.    inline($FA);
  128.  
  129. procedure enable_int;
  130.    inline($FB);
  131.  
  132. procedure INTR_service_transmit;
  133. procedure INTR_poll_transmit;
  134. procedure INTR_service_receive;
  135. procedure INTR_check_interrupts;
  136.  
  137. procedure cancel_xoff;
  138. procedure control_k;
  139. procedure INTR_lower_dtr;
  140. procedure INTR_raise_dtr;
  141. procedure INTR_select_port(chan: integer);
  142.  
  143. procedure INTR_init_com(chan: integer);
  144. procedure INTR_flush_com;
  145. procedure INTR_uninit_com;
  146. procedure INTR_transmit_data(s:    longstring);
  147. function  INTR_receive_ready: boolean;
  148. function  INTR_receive_data:  char;
  149. procedure verify_txque_space;
  150.  
  151.